#ifndef _APPLICATION_H_
#define _APPLICATION_H_

#include <freertos/FreeRTOS.h>
#include <freertos/event_groups.h>
#include <freertos/task.h>
#include <string>
#include <mutex>
#include <list>
#include <web_socket.h>

// 定义事件位
#define SCHEDULE_EVENT (1 << 0)
#define AUDIO_INPUT_READY_EVENT (1 << 1)
#define AUDIO_OUTPUT_READY_EVENT (1 << 2)


class Application {
public:
    static Application& GetInstance() {
        static Application instance;
        return instance;
    }
    // 禁用通过拷贝构造函数来创建Application类对象
    Application(const Application&) = delete;
    Application& operator=(const Application&) = delete;

    // 启动初始化加载项，启动配网，启动主循环
    void Start();

    // 开始倾听
    void StartListening();
    // 停止倾听
    void StopListening();

private:
    Application(); //构造函数声明
    ~Application();//析构函数声明

    // 互斥锁对象（用于保证执行任务列表线程安全）
    std::mutex mutex_;
    // 任务列表（用于执行非声音事件外的其他任务，可自定义task并添加进去）
    std::list<std::function<void()>> main_tasks_;
    // 事件组句柄
    EventGroupHandle_t event_group_;

    // 主循环（根据事件组唤醒并处理所有事件）
    void MainLoop();

    // 声音处理事件
    void InputAudio();
    void OutputAudio();
};

#endif // _APPLICATION_H_
